package com.wmx.yuanyuan.awt;

import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;

/**
 * java.awt Robot 自动化测试 与 KeyEvent 常用按键
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2022/1/27 16:57
 */
public class KeyEventUtils {

    /**
     * 模拟按下键盘单个按键，比如文档下一页：PgDn，上一页是PgUp等
     *
     * @param keycode：按键的值,如：KeyEvent.VK_PAGE_UP
     */
    public static final void pressSingleKeyByNumber(int keycode) throws AWTException {
        /** 创建自动化测试对象  */
        Robot robot = new Robot();
        /**按下按键*/
        robot.keyPress(keycode);
        /**松开按键*/
        robot.keyRelease(keycode);
        /**可以稍作延时处理*/
        robot.delay(500);
    }

    /**
     * 按下组合键，如 ctrl + c、ctrl + v、alt + tab 等等
     *
     * @param keycode：组合健数组，如 {KeyEvent.VK_CONTROL,KeyEvent.VK_V}
     */
    public static void pressMultipleKeyByNumber(int... keycode) throws AWTException {
        Robot robot = new Robot();
        //按顺序按下健
        for (int i = 0; i < keycode.length; i++) {
            robot.keyPress(keycode[i]);
            robot.delay(50);
            System.out.println("按下：" + keycode[i]);
        }
        //按反序松开健
        for (int i = keycode.length - 1; i >= 0; i--) {
            robot.keyRelease(keycode[i]);
            robot.delay(50);
            System.out.println("松开：" + keycode[i]);
        }
    }

    /**
     * 模拟用户单击屏幕指定区域,默认单击屏幕最中央
     * 如果是右键，请使用：InputEvent.BUTTON3_DOWN_MASK
     *
     * @param x：x坐标
     * @param y：y坐标
     */
    public static final void clickScreenByXY(Integer x, Integer y) throws AWTException {
        /**创建工具包对象*/
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        /**创建自动化对象*/
        Robot robot = new Robot();
        /**利用工具包对象获取屏幕分辨率*/
        if (x == null) {
            x = toolkit.getScreenSize().width / 2;
        }
        if (y == null) {
            y = toolkit.getScreenSize().height / 2;
        }
        /**
         * 移动鼠标到指定位置
         * 然后按下鼠标左键，再松开，模拟单击操作
         */
        robot.mouseMove(x, y);
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
        robot.delay(100);
    }

    /**
     * 自动将鼠标移动到指定的位置
     * 如果参数x与y为null,则默认将鼠标放在屏幕右侧中间隐藏
     *
     * @param x：x坐标 ,左上角 为0----设定值超过屏幕分辨率也没关系
     * @param y：y坐标 ,左上角 为0----设定值超过屏幕分辨率也没关系
     */
    public static final void mouseMoveToXY(Integer x, Integer y) throws AWTException {
        /**创建工具包对象*/
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        /**创建自动化对象*/
        Robot robot = new Robot();
        /**利用工具包对象获取屏幕分辨率*/
        if (x == null) {
            x = toolkit.getScreenSize().width;
        }
        if (y == null) {
            y = toolkit.getScreenSize().height / 2;
        }
        /**
         * 移动鼠标到指定位置
         *  robot.delay(100);延时100毫秒
         */
        robot.mouseMove(x, y);
        robot.delay(100);
    }

    /**
     * 自动化-最大化窗口，模拟按 Alt+ 空格 + X
     * 切记当同时按有顺序的组合键时，应该在间隔处添加细微的延时，否则容易引起失败(因为按键速度太快，导致混乱)
     */
    public static void automaticFullScreen() throws AWTException {
        System.out.println("Automatic full screen start.....");
        pressMultipleKeyByNumber(KeyEvent.VK_ALT, KeyEvent.VK_SPACE, KeyEvent.VK_X);
        System.out.println("Automatic full screen finish.....");
    }

    /**
     * 调用系统剪切板粘贴内容
     *
     * @param ：需要被放入到系统剪切板粘贴的内容
     * @throws Exception
     */
    public static void pasteContent(String content) throws Exception {
        //创建字符串选择器，并将需要放入剪切板的内容传给它
        StringSelection stringSelection = new StringSelection(content);

        //创建系统剪贴板，并设置内容，相当于把内容放入系统的剪切板中，用户也可以手动 ctrl + v 找他
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        clipboard.setContents(stringSelection, null);

        for (int i = 3; i > 0; i--) {
            System.out.println(i + " 秒后自动粘贴内容.");
            TimeUnit.SECONDS.sleep(1);
        }

        //最后按 Ctrl + v 快捷键，将系统剪切板中得内容粘贴出来.
        pressMultipleKeyByNumber(KeyEvent.VK_CONTROL, KeyEvent.VK_V);
    }

    /**
     * 读取系统剪切板文本内容
     *
     *
     * @throws Exception
     */
    public static void readClipboardData() throws Exception {
        // 创建 Clipboard 对象
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        // 从剪贴板获取内容
        Transferable transferable = clipboard.getContents(null);
        // 判断内容类型
        if (transferable != null && transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
            String text = (String) transferable.getTransferData(DataFlavor.stringFlavor);
            System.out.println("剪贴板内容：\r\n" + text);
        } else {
            System.out.println("无效或不支持的剪贴板文本内容");
        }
    }

    public static void main(String[] args) throws Exception {
        // automaticFullScreen();
        // pasteContent("我爱你");
        readClipboardData();
    }

}
